package com.grupobbva.seguridad.filter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.grupobbva.bc.per.tele.seguridad.ServiciosSeguridadBbva;
import com.grupobbva.seguridad.client.domain.Usuario;
import com.grupobbva.seguridad.client.util.Constante;
import com.grupobbva.seguridad.client.util.UtilDesarrollo;
import com.grupobbva.seguridad.service.SeguridadService;
import com.grupobbva.seguridad.util.Util;
import com.grupobbva.seguridad.web.servlet.action.BaseController;
import com.grupobbva.seguridad.webservice.SeguridadWS;
import com.grupobbva.seguridad.webservice.util.Parametro;
import com.grupobbva.seguridad.webservice.util.Respuesta;

public class ValidacionSessionFilter_NEW implements Filter {
	
	public FilterConfig config; 
	protected boolean modoDesarrollo;
	private SeguridadWS seguridadWS;

    public ValidacionSessionFilter_NEW() {
        
    }

	public void init(FilterConfig fConfig) throws ServletException {
		this.config = fConfig;
		String modo = config.getInitParameter(Constante.PARA_MODO_DESARROLLO);
		String jndi = config.getInitParameter(Constante.PARA_JNDI_SEGURIDAD);
		modoDesarrollo = (modo != null && modo.trim().toUpperCase().equals("TRUE"));
		Constante.JNDI_SEGURIDAD = (jndi==null || jndi.trim().equals(""))?Constante.JNDI_SEGURIDAD:jndi;
		
		ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(fConfig.getServletContext());
		seguridadWS = (SeguridadWS) ctx.getBean("seguridadWS");
	}

	public void destroy() {
		
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		/*
		HttpSession sesion = ((HttpServletRequest)request).getSession();
		String mensaje = "";
		try {
			if(sesion.getAttribute(Constante.SESSION_USUARIO) == null) {
				String contexto  = (((HttpServletRequest) request).getRequestURI()).split("/")[1];
				String usuarioId = null;
				Usuario usuario  = null;
				
				//SI SE ESTA EN MODO PRODUCCION
				if (modoDesarrollo == false) {
					try {
						ServiciosSeguridadBbva servicios = new ServiciosSeguridadBbva((HttpServletRequest) request);
						servicios.obtener_ID();
						usuarioId = servicios.getUsuario().toUpperCase();
					} catch (Exception e) {
						e.printStackTrace();
					}
					
					if(usuarioId == null || usuarioId.equals("")) {
						usuarioId = request.getParameter(Constante.REQUEST_USUARIO_ID);
					}
					
					Respuesta respuesta = seguridadWS.validarUsuario(new Parametro(contexto, usuarioId));
					usuario = com.grupobbva.seguridad.client.service.SeguridadService.generarUsuarioRespuesta(respuesta);
					
				//SI SE ESTA EN MODO DESARROLLO
				} else {
					usuario = UtilDesarrollo.generarDatosUsuario();
				}
				sesion.setAttribute(Constante.SESSION_USUARIO, usuario);
				
				ejecutarLoginExito((HttpServletRequest) request, (HttpServletResponse) response);
			}
		} catch(Exception e) {
			mensaje = e.getMessage();
			e.printStackTrace();
			
			ejecutarLoginError((HttpServletRequest) request, (HttpServletResponse) response);
		}
		if(sesion.getAttribute(Constante.SESSION_USUARIO) == null) {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter();
			out.write("<center>La validacion del usuario no fue satisfactoria por el siguiente motivo: "+mensaje+"</center>");
			out.close();
		}
		chain.doFilter(request, response);
		*/
	}
	
	protected void ejecutarLoginExito(HttpServletRequest request, HttpServletResponse response) {
		Usuario usuario = (Usuario) request.getSession().getAttribute(Constante.SESSION_USUARIO);

		String contexto  = (((HttpServletRequest) request).getRequestURI()).split("/")[1];
		
		ApplicationContext springcontext  = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession(false).getServletContext());
		SeguridadService seguridadService = (SeguridadService) springcontext.getBean("seguridadService");
		
		try {
	    	com.grupobbva.seguridad.domain.Usuario usuarioApp = seguridadService.validarUsuario(contexto, usuario.getUsuarioId());
	    	
	    	HttpSession session = request.getSession(true);
	    	session.setAttribute(com.grupobbva.seguridad.util.Constante.USUARIO, usuarioApp);
			
	    	request.getRequestDispatcher(Util.getRelativeURL(BaseController.getNavigationMain(usuarioApp))).forward(request,response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	protected void ejecutarLoginError(HttpServletRequest request, HttpServletResponse response) {
		
	}
}